package cn.stylefeng.guns.core.util;

import cn.stylefeng.guns.core.common.constant.Constants;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;

/**
 * 系统名称：济南服务外包公共服务平台 概要：导入到EXCEL 类名称：ObjectExcelView
 * 
 * @author FH
 * @version 1.0
 */
public class ObjectExcelView{

	/**
	 * 生成excel
	 */
	public static void exportExcel(String path, HashMap<String, Map<String,Object>> map) {
		File newFile = new File(path);
		// 新文件写入数据，并下载*****************************************************
		InputStream is = null;
		FileOutputStream fos = null;
		XSSFWorkbook workbook = null;
		XSSFSheet sheet = null;
		int cellNum = 0;
		try {
			if(!newFile.exists()){
				newFile.createNewFile();
			}
			is = new FileInputStream(newFile);// 将excel文件转为输入流
			workbook = new XSSFWorkbook(is);// 创建个workbook，
			// 获取第一个sheet
			sheet = workbook.getSheetAt(0);
			XSSFRow row = sheet.getRow(1);//获得标题行 
			cellNum = row.getLastCellNum();//标题行的最后一个单元格 
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		if (sheet != null) {
			try {
				fos = new FileOutputStream(newFile);
				// 写数据
				int i = 2;
				Iterator<String> it = map.keySet().iterator();
				while (it.hasNext()) {
					String key = it.next();
					Map<String,Object> pd = map.get(key);
					XSSFRow row = sheet.createRow(i);
					for (int j = 0; j < cellNum; j++) {
						XSSFCell cell = row.createCell(j);
						if (key.split(Constants.COMMAT)[0].substring("var".length()).equals(j + "")) {
							CellStyle style = workbook.createCellStyle(); // 样式对象
							// 设置单元格的背景颜色为红色
							style.setFillForegroundColor(IndexedColors.ORANGE.getIndex());
							style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
							cell.setCellStyle(style);
						}
						cell.setCellValue(pd.get("var" + j)+"");
					}
					i++;
				}
				workbook.write(fos);
				fos.close();
				is.close();

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 生成excel
	 */
	public static void exportExcel(String path, List<Map<String,Object>> list) {
		File newFile = new File(path);
		// 新文件写入数据，并下载*****************************************************
		InputStream is = null;
		FileOutputStream fos = null;
		XSSFWorkbook workbook = null;
		XSSFSheet sheet = null;
		try {
			is = new FileInputStream(newFile);// 将excel文件转为输入流
			workbook = new XSSFWorkbook(is);// 创建个workbook，
			// 获取第一个sheet
			sheet = workbook.getSheetAt(0);
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		if (sheet != null) {
			try {
				fos = new FileOutputStream(newFile);
				// 写数据
				for(int i=0;i<list.size();i++){
					Map<String,Object> pd = list.get(i);
					XSSFRow row = sheet.createRow(i);
					for (int j = 0; j <= 10; j++) {
						XSSFCell cell = row.createCell(j);
						cell.setCellValue(pd.get("var" + j)+"");
					}	
				}
				workbook.write(fos);
				fos.close();
				is.close();

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		// 删除创建的新文件
		// this.deleteFile(newFile);
	}

	/**
	 * excel导出
	 * @param fileName	文件名
	 * @param sheetName 工作簿名
	 * @param headRow 	从第n行开始
	 * @param columns 	表头
	 * @param titles 	字段
	 * @param list 		数据集
	 * @param excelFont 默认字体
	 * @param fontSize 	字体大小
	 * @param width 	单元格宽度
	 * @param height 	单元格高度
	 * @param response 
	 */
	@SuppressWarnings({ "resource", "deprecation" })
	public static void downExcel(String fileName, String sheetName, int headRow, String[] columns, String[] titles,
			List<Map<String,Object>> list,String excelFont,int fontSize,int width,int height, HttpServletResponse response) {
		
		try {
			// 第一步，创建一个Excel文件
			HSSFWorkbook workbook = new HSSFWorkbook();
			// 第二步，创建一个工作簿
			HSSFSheet sheet = workbook.createSheet(sheetName);
			// 第三步，创建第n行
			HSSFRow row = sheet.createRow(headRow);
			//第四步，创建单元格
			HSSFCell cell;
			// 第五步，设置表头
			
			// 样式
			HSSFCellStyle styleHead = workbook.createCellStyle();
			HSSFFont fontHead = workbook.createFont();
			// 字体加粗
			fontHead.setBold(true);
			// 字体
			fontHead.setFontName(excelFont);
			// 字体大小
			fontHead.setFontHeightInPoints((short) fontSize);
			styleHead.setFont(fontHead);
			
			if (columns.length > 0) {
				for (int i = 0; i < columns.length; i++) {
					// 单元格大小
					sheet.setColumnWidth((short) i, (short) width);
					// 创建单元格
					cell = row.createCell(i);
					cell.setCellValue(columns[i]);// 设置单元格值
					cell.setCellStyle(styleHead);// 设置单元格样式
				}
				headRow++;
			}
			// 第六步,写入实体数据
			
			// 样式
			HSSFCellStyle styleCenter = workbook.createCellStyle();
			HSSFFont fontCenter = workbook.createFont();
			// 字体
			fontCenter.setFontName(excelFont);
			// 字体大小
			fontCenter.setFontHeightInPoints((short) fontSize);
			styleCenter.setFont(fontCenter);
			
			if(list!=null && list.size()>0){
				for (int i = 0; i < list.size(); i++) {// 行
					row = sheet.createRow(i + headRow);
					if(titles.length>0){
						for (int j = 0; j < titles.length; j++) {// 列
							// 单元格大小
							sheet.setColumnWidth((short) i, (short) width);
							cell = row.createCell(j);
							cell.setCellValue(list.get(i).get(titles[j])+"");// 设置单元格值
							cell.setCellStyle(styleCenter);// 设置单元格样式
						}
					}
				}
			}
			// 第七步，将文件输出到客户端浏览器
			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			
			OutputStream ouputStream = response.getOutputStream();
			workbook.write(ouputStream);
			ouputStream.flush();
			ouputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		

	}

	/**
	 * XSSFWorkbook导出excel
	 * @param fileName	文件名
	 * @param sheetName 工作簿名
	 * @param headRow 	从第n行开始
	 * @param columns 	表头
	 * @param titles 	字段
	 * @param list 		数据集
	 * @param excelFont 默认字体
	 * @param fontSize 	字体大小
	 * @param width 	单元格宽度
	 * @param height 	单元格高度
	 * @param response 
	 */
	@SuppressWarnings({ "resource", "deprecation" })
	public static void downXssfExcel(String fileName, String sheetName, int headRow, String[] columns, String[] titles,
			List<Map<String,Object>> list,String excelFont,int fontSize,int width,int height, HttpServletResponse response) {
		
		try {
			// 第一步，创建一个Excel文件
			XSSFWorkbook workbook = new XSSFWorkbook();
			// 第二步，创建一个工作簿
			XSSFSheet sheet = workbook.createSheet(sheetName);
			// 第三步，创建第n行
			XSSFRow row = sheet.createRow(headRow);
			//第四步，创建单元格
			XSSFCell cell;
			// 第五步，设置表头
			
			// 样式
			XSSFCellStyle styleHead = workbook.createCellStyle();
			XSSFFont fontHead = workbook.createFont();
			// 字体加粗
			fontHead.setBold(true);
			// 字体
			fontHead.setFontName(excelFont);
			// 字体大小
			fontHead.setFontHeightInPoints((short) fontSize);
			styleHead.setFont(fontHead);
			
			if (columns.length > 0) {
				for (int i = 0; i < columns.length; i++) {
					// 单元格大小
					sheet.setColumnWidth((short) i, (short) width);
					// 创建单元格
					cell = row.createCell(i);
					cell.setCellValue(columns[i]);// 设置单元格值
					cell.setCellStyle(styleHead);// 设置单元格样式
				}
				headRow++;
			}
			// 第六步,写入实体数据
			
			// 样式
			XSSFCellStyle styleCenter = workbook.createCellStyle();
			XSSFFont fontCenter = workbook.createFont();
			// 字体
			fontCenter.setFontName(excelFont);
			// 字体大小
			fontCenter.setFontHeightInPoints((short) fontSize);
			styleCenter.setFont(fontCenter);
			
			if(list!=null && list.size()>0){
				for (int i = 0; i < list.size(); i++) {// 行
					row = sheet.createRow(i + headRow);
					if(titles.length>0){
						for (int j = 0; j < titles.length; j++) {// 列
							// 单元格大小
							sheet.setColumnWidth((short) i, (short) width);
							cell = row.createCell(j);
							cell.setCellValue(list.get(i).get(titles[j])+"");// 设置单元格值
							cell.setCellStyle(styleCenter);// 设置单元格样式
						}
					}
				}
			}
			// 第七步，将文件输出到客户端浏览器
			response.setContentType("application/octet-stream");
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			
			OutputStream ouputStream = response.getOutputStream();
			workbook.write(ouputStream);
			ouputStream.flush();
			ouputStream.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		

	}
}
